package uva.sc.qls.parser; import java.util.ArrayList; import java.util.List; import uva.sc.core.INode; import uva.sc.core.types.Boolean; import uva.sc.core.types.Number; import uva.sc.core.types.String; import uva.sc.core.types.Type; import uva.sc.qls.logic.*; import uva.sc.qls.logic.fonts.Arial; import uva.sc.qls.logic.fonts.Bazooka; import uva.sc.qls.logic.fonts.BookAntiqua; import uva.sc.qls.logic.fonts.Courier; import uva.sc.qls.logic.fonts.Dialog; import uva.sc.qls.logic.fonts.FontType; import uva.sc.qls.logic.fonts.TimesNewRoman; import uva.sc.qls.logic.style.Color; import uva.sc.qls.logic.style.DefaultStyle; import uva.sc.qls.logic.style.Font; import uva.sc.qls.logic.style.FontSize; import uva.sc.qls.logic.style.StyleProperty; import uva.sc.qls.logic.style.Width; import uva.sc.qls.widgetTypes.Checkbox; import uva.sc.qls.widgetTypes.Radio; import uva.sc.qls.widgetTypes.Spinbox; import uva.sc.qls.widgetTypes.WidgetType; public class ASTGeneratorVisitor extends QLSGrammarBaseVisitor<INode> { public StyleSheet visitStylesheet(QLSGrammarParser.StylesheetContext ctx) { List<Page> pages = new ArrayList<Page>(); ID id = new ID(ctx.ID().getText()); for (QLSGrammarParser.PageContext pageContext : ctx.pages) { pages.add((Page) visitPage(pageContext)); } return new StyleSheet(id, pages); } public Page visitPage(QLSGrammarParser.PageContext ctx) { List<Section> sections = new ArrayList<Section>(); ID id = new ID(ctx.ID().getText()); DefaultStyle defaultStyle = null; if (ctx.defaultStyle() != null) { defaultStyle = (DefaultStyle) visitDefaultStyle(ctx.defaultStyle()); } for (QLSGrammarParser.SectionContext sectionContext : ctx.sections) { sections.add((Section) visitSection(sectionContext)); } return new Page(id, sections, defaultStyle); } public Section visitSection(QLSGrammarParser.SectionContext ctx) { SectionBody sectionBody = (SectionBody) visitSectionBody(ctx.sectionBody()); return new Section(ctx.STRING().getText(), sectionBody); } public SectionBody visitSectionBody(QLSGrammarParser.SectionBodyContext ctx) { List<Question> questions = new ArrayList<Question>(); List<Section> sections = new ArrayList<Section>(); DefaultStyle defaultStyle = null; for (QLSGrammarParser.QuestionContext questionContext : ctx.questions) { questions.add((Question) visitQuestion(questionContext)); } for (QLSGrammarParser.SectionContext sectionContext : ctx.sections) { sections.add((Section) visitSection(sectionContext)); } if (ctx.defaultStyle() != null) { defaultStyle = (DefaultStyle) visitDefaultStyle(ctx.defaultStyle()); } return new SectionBody(questions, sections, defaultStyle); } public Question visitQuestion(QLSGrammarParser.QuestionContext ctx) { ID id = new ID(ctx.ID().getText()); Widget widget = null; if (ctx.widget() != null) { widget = (Widget) visitWidget(ctx.widget()); } return new Question(id, widget); } public Widget visitWidget(QLSGrammarParser.WidgetContext ctx) { WidgetType widgetType = (WidgetType) this.visit(ctx.widgetType()); Widget widget = null; if (ctx.STRING(0) == null || ctx.STRING(1) == null) { widget = new Widget(widgetType); } else { widget = new Widget(widgetType, ctx.STRING(0).getText(), ctx.STRING(1).getText()); } return widget; } public DefaultStyle visitDefaultStyle(QLSGrammarParser.DefaultStyleContext ctx) { List<StyleProperty> stylePropertyList = new ArrayList<StyleProperty>(); Type type = (Type) this.visit(ctx.type()); Widget widget = (Widget) visitWidget(ctx.widget()); for (QLSGrammarParser.StylePropertyContext stylePropertyContext : ctx.styleProperties) { stylePropertyList.add((StyleProperty) this.visit(stylePropertyContext)); } return new DefaultStyle(type, stylePropertyList, widget); } public Boolean visitBoolean(QLSGrammarParser.BooleanContext ctx) { return new Boolean(); } public Number visitNumber(QLSGrammarParser.NumberContext ctx) { return new Number(); } public String visitString(QLSGrammarParser.StringContext ctx) { return new String(); } public Width visitWidth(QLSGrammarParser.WidthContext ctx) { return new Width(Integer.parseInt(ctx.NUMBER().getText())); } public Font visitFontName(QLSGrammarParser.FontNameContext ctx) { FontType fontType = (FontType) this.visit(ctx.font()); return new Font(fontType); } public FontSize visitFontsize(QLSGrammarParser.FontsizeContext ctx) { return new FontSize(Integer.parseInt(ctx.NUMBER().getText())); } public Color visitColor(QLSGrammarParser.ColorContext ctx) { return new Color(ctx.COLORENCODE().getText()); } public Checkbox visitCheckbox(QLSGrammarParser.CheckboxContext ctx) { return new Checkbox(); } public Spinbox visitSpinbox(QLSGrammarParser.SpinboxContext ctx) { return new Spinbox(); } public Radio visitRadio(QLSGrammarParser.RadioContext ctx) { return new Radio(); } public Arial visitArial(QLSGrammarParser.ArialContext ctx) { return new Arial(); } public TimesNewRoman visitTimesNewRoman(QLSGrammarParser.TimesNewRomanContext ctx) { return new TimesNewRoman(); } public Bazooka visitBazooka(QLSGrammarParser.BazookaContext ctx) { return new Bazooka(); } public BookAntiqua visitBookAntiqua(QLSGrammarParser.BookAntiquaContext ctx) { return new BookAntiqua(); } public Courier visitCourier(QLSGrammarParser.CourierContext ctx) { return new Courier(); } public Dialog visitDialog(QLSGrammarParser.DialogContext ctx) { return new Dialog(); } }